import pandas as pd
import matplotlib.pyplot as plt
import re
import warnings  # 新增：用于过滤警告

# 过滤字体相关的运行时警告
warnings.filterwarnings("ignore", category=RuntimeWarning, module="matplotlib")

# 读取数据并设置列名
info = pd.read_csv('information.csv', header=None)
colNames = [
    'positionName', 'minimumWage', 'maximumWage', 'exp',
    'educationalRequirements', 'detailedAddress',
    'shortName', 'industry', 'personScope', 'econKind', 'jobDescribe', 'companySize'
]
info.columns = colNames

# 薪资数据处理（假设单位为元，直接计算平均）
info['minimumWage'] = pd.to_numeric(info['minimumWage'], errors='coerce').fillna(0)
info['maximumWage'] = pd.to_numeric(info['maximumWage'], errors='coerce').fillna(0)
info['salary'] = info[['minimumWage', 'maximumWage']].mean(axis=1, numeric_only=True)

print("薪资数据前5行：")
print(info[['minimumWage', 'maximumWage', 'salary']].head())

# 人员规模数据处理函数（处理空值、提取数字、计算平均值）
def process_person_scope(x):
    if pd.isna(x):  # 处理空值
        return 0
    x_str = str(x)
    nums = re.findall(r'\d+', x_str)  # 提取所有数字
    if not nums:  # 无数字时返回0
        return 0
    try:
        avg = sum(map(int, nums)) // len(nums)  # 整数除法取整
        return avg
    except ZeroDivisionError:
        return 0

info['personScope'] = info['personScope'].apply(process_person_scope)

# 数据清洗：处理空值和无效字符
info['educationalRequirements'] = info['educationalRequirements'].fillna('未注明')
info['industry'] = info['industry'].fillna('未分类').astype(str).apply(lambda x: re.sub(r'[\[\]\'\"]', '', x))
info['econKind'] = info['econKind'].fillna('未分类')

# 设置中文字体（确保支持全字符）
plt.rcParams['font.family'] = 'SimHei'  # 使用黑体，兼容中英文
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 学历要求分布
a = info['educationalRequirements'].value_counts()
plt.subplots_adjust(bottom=0.15)
plt.bar(a.index, a)
plt.xticks(rotation=45)
plt.title('学历要求分布')
plt.show()

# 2. 各行业招聘需求数量
industry = ' '.join(info['industry'].tolist())
b = pd.Series(industry.split()).value_counts()
plt.subplots_adjust(bottom=0.15)
plt.bar(b.index, b)
plt.xticks(rotation=45)
plt.title('各行业招聘需求数量')
plt.show()

# 3. 不同类型公司招聘需求
a = info['econKind'].value_counts()
plt.subplots_adjust(bottom=0.15)
plt.bar(a.index, a)
plt.xticks(rotation=45)
plt.title('不同类型公司招聘需求')
plt.show()

# 4. 不同类型公司薪资待遇对比
disSalary = info.groupby('econKind')['salary'].mean().sort_values()
plt.figure(figsize=(10, 6))
plt.subplots_adjust(bottom=0.15)

bars = plt.bar(disSalary.index, disSalary)
plt.xticks(rotation=45, ha='right')
plt.title('不同类型公司薪资待遇对比')
plt.xlabel('公司类型')
plt.ylabel('平均薪资（元）')

# 添加千位分隔符标签
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 200,
             f'{height:,.0f}',  # 显示千位分隔符
             ha='center', va='bottom')

plt.show()

# 5. 不同人员规模公司薪资待遇对比
disSalary_scope = info.groupby('personScope')['salary'].mean().sort_index()
plt.figure(figsize=(10, 6))
plt.subplots_adjust(bottom=0.15)

bars = plt.bar(disSalary_scope.index, disSalary_scope.values)
plt.xticks(rotation=45, ha='right')
plt.title('不同人员规模公司薪资待遇对比')
plt.xlabel('人员规模（人）')
plt.ylabel('平均薪资（元）')

# 添加千位分隔符标签
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 200,
             f'{height:,.0f}',
             ha='center', va='bottom')

plt.show()